package com.yangit.temp.common.util.md5;

import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

import com.yangit.temp.common.util.string.StringUtils;


/**
 * 字典序全排列 字符串的全排列 比如单词"too" 它的全排列是"oot","oto","too"
 * 1，从右端开始扫描，若出现前一个比后一个小，记录前一个的元素下表index 2,再找出index以后比该元素大的中的最小值的下标，(实现见
 * 下面的getMin方法) 3,index以后的元素实现反转（实现 见下面的reverse方法） 结束条件：前一个都比后一个大的情况
 */
public class StringExpress {
	int getMin(char[] input, int index) {
		char min = input[index];
		int minIndex = index + 1;
		char result = 'z';
		for (int i = index + 1; i < input.length; i++) {
			if (input[i] > min && input[i] < result) {
				result = input[i];
				minIndex = i;
			}
		}
		return minIndex;
	}

	void exchange(char[] input, int index, int minIndex) {
		char temp = input[index];
		input[index] = input[minIndex];
		input[minIndex] = temp;
	}

	void reverse(char input[], int first, int end) {
		while (first < end) {
			exchange(input, first, end);
			first++;
			end--;
		}
	}

	void getDictionary(char c[]) {
		System.out.println(new String(c));
		// boolean flag=true;
		int i = 0;
		while (true) {
			i = c.length - 1;
			for (; i > 0; i--) {
				if (c[i - 1] < c[i])
					break;
			}
			if (i == 0)
				break;
			int minIndex = getMin(c, i - 1);
			exchange(c, i - 1, minIndex);
			reverse(c, i, c.length - 1);
			System.out.println(new String(c));
		}

	}

	public static void main(String[] args) {
		String input = "aat";
		char[] c = input.toCharArray();
		Arrays.sort(c);
		new StringExpress().getDictionary(c);
	}

	/**
	 *
	 * 
	 * 
	 * 方法用途: 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)，并且生成url参数串
	 * 
	 * 实现步骤:
	 *
	 * 
	 * 
	 * @param paraMap    要排序的Map对象
	 * 
	 * @param urlEncode  是否需要URLENCODE
	 * 
	 * @param keyToLower 是否需要将Key转换为全小写
	 * 
	 *                   true:key转化成小写，false:不转化
	 * 
	 * @return
	 * 
	 */
	public static String formatUrlMap(Map paraMap, boolean urlEncode, boolean keyToLower)

	{
		String buff = "";

		Map tmpMap = paraMap;

		try

		{
			List<Map.Entry<String, String>> infoIds = new ArrayList(tmpMap.entrySet());

			// 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)

			Collections.sort(infoIds, new Comparator<Object>() {

				@Override
				public int compare(Object o1, Object o2) {
					// TODO Auto-generated method stub
					return 0;
				}

			});

			// 构造URL 键值对的格式

			StringBuilder buf = new StringBuilder();

			for (Map.Entry<String, String> item : infoIds) {
				if (StringUtils.isNotBlank(item.getKey()))

				{
					String key = item.getKey();

					String val = item.getValue();

					if (urlEncode)

					{
						val = URLEncoder.encode(val, "utf-8");

					}

					if (keyToLower)

					{
						buf.append(key.toLowerCase() + "=" + val);

					} else

					{
						buf.append(key + "=" + val);

					}

					buf.append("&");

				}

			}

			buff = buf.toString();

			if (buff.isEmpty() == false)

			{
				buff = buff.substring(0, buff.length() - 1);

			}

		} catch (Exception e)

		{
			return null;

		}

		return buff;

	}

}